/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package controller;

import model.Benutzer;
import model.DatenVerwaltung;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.Immobilie;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

/**
 *
 * @author student
 */
public class ControllerServlet extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    DatenVerwaltung dv;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        //response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        try 
        {
            //Button auslesen, der gedrückt wurden
            String button =request.getParameter("submit");
            HttpSession session = request.getSession(true);
            
            //Beim ersten mal Datenverwaltung erstellen und Server mit BeispielDatenfüllen
            if(dv==null){
                dv = new DatenVerwaltung();
                
                dv.testNutzerErstellen();
                dv.testImmobilienErstellen();
            }

            //riesiger switch-case block..das hier kann quasi alles ;)
            switch (button) {
                
                //source: login.jsp
                //prüft ob Eingabedaten korrekt sind und speichert Benutzerdaten dann in Session
                case "Einloggen":
                {
                    String benutzer = request.getParameter("benutzer");
                    String passwort = request.getParameter("passwort");
                    if(dv.pruefeLogin(benutzer, passwort)== true)
                    {
                        session.setAttribute("Benutzer",dv.getBenutzerByName(benutzer));
                        session.setAttribute("BenutzerListe",dv.getBenutzer()); 
                        session.setAttribute("ImmobilienListe",dv.getImmobilien());
                        session.setAttribute("Login","1");
                        response.sendRedirect("login.jsp");      
                    }
                    else
                    {
                        session.setAttribute("Login","2");
                        response.sendRedirect("login.jsp");            
                    }
                    break;
                }
                    
                //source: benutzer.jsp
                //entfernt Benutzerdaten aus Session
                case "Ausloggen":
                {
                    session.removeAttribute("Benutzer");
                    session.removeAttribute("Login");
                    session.removeAttribute("Register");
                    response.sendRedirect("index.jsp");
                    break;
                }
                    
                //source: register.jsp
                //Prüft ob Benutzer noch nicht vorhanden ist und legt dann neuen Datensatz in der Datenverwaltung an
                case "Registrieren":
                {
                    String benutzer = request.getParameter("benutzer");
                    String passwort = request.getParameter("passwort");
                    String rolle = request.getParameter("rolle");
                    if(dv.existiertBenutzer(benutzer))
                    {
                        session.setAttribute("Register","2");
                        response.sendRedirect("register.jsp");   
                    }
                    else
                    {   
                        int rol = Integer.parseInt(rolle);
                        dv.benutzerHinzufuegen(dv.getBenutzerAnzahl()+1, benutzer, rol, "keine angabe email", passwort, "keine angabe telnr", "keine angabe handynr", "keine angabe anrede", "keine angabe vorname", "keine angabe nachname", 0, "keine angabe ort", "keine angabe strasse", 0);
                        session.setAttribute("Benutzer",dv.getBenutzerByName(benutzer));
                        session.setAttribute("BenutzerListe",dv.getBenutzer()); 
                        session.setAttribute("ImmobilienListe",dv.getImmobilien());
                        session.setAttribute("Register","1");
                        response.sendRedirect("register.jsp");  
                    }
                    break;
                }
                
                //source:index.jsp, immobilie.jsp, immobilienSuche.jsp
                //Bekommt 5 Parameter zur Suche und legt dann ein Suchmuster-Objekt an, 
                //mit dem dann aus der Liste mit allen Objekten die passenden herausgefiltert werden
                case "Suchen!":
                {
                    String ort = ""+request.getParameter("ort");
                    String status = ""+request.getParameter("status");
                    String zimmer = ""+request.getParameter("zimmer");
                    String preis = ""+request.getParameter("preis");
                    String flaeche = ""+request.getParameter("flaeche");
                    int statusi = Integer.parseInt(status);
                    double zimmeranz = Double.parseDouble(zimmer);
                    double preisd=9999;
                    if(!preis.equals(""))   
                        preisd = Double.parseDouble(preis);
                    double flaeched=0;
                    if(!flaeche.equals(""))   
                        flaeched = Double.parseDouble(flaeche);
                    Immobilie immobilie = new Immobilie(0, 0, statusi, 0, 0, 0, 0, false, false, false, 0, zimmeranz, preisd, 0.0, 0.0, 0.0, flaeched, "", ort, 0, "", 0, "", "", "", "", "", "", "");
                    session.setAttribute("ImmobilienSuche",immobilie);
                    session.setAttribute("ImmobilienListe",dv.getImmobilien());
                    session.setAttribute("BenutzerListe",dv.getBenutzer());
                    response.sendRedirect("immobilienSuche.jsp");
                    break;
                }
                  
                //source: benutzer.jsp
                //Bekommt Grundparameter einer Immobilie übergeben und 
                //legt damit ein neues Objekt mit passender ID und BenutzerID in der Datenverwaltung an
                case "Neue Immobilie":
                {
                    String fk_id = ""+request.getParameter("fk_id");
                    String titel = ""+request.getParameter("titel");
                    String ort = ""+request.getParameter("ort");
                    String status = ""+request.getParameter("status");
                    String preis = request.getParameter("preis");
                    String flaeche = ""+request.getParameter("flaeche");
                    String zimmer = ""+request.getParameter("zimmer");
                    int statusi = Integer.parseInt(status);
                    int fk_idi = Integer.parseInt(fk_id);
                    double zimmeranz = Double.parseDouble(zimmer);
                    double preisd=0;
                    if(!preis.equals(""))   
                        preisd = Double.parseDouble(preis);
                    double flaeched=0;
                    if(!flaeche.equals(""))   
                        flaeched = Double.parseDouble(flaeche);
                    int neueId = dv.getImmobilienAnzahl()+1;
                    dv.immobilieHinzufuegen(neueId, fk_idi, statusi, 0, 0, 0, 0, false, false, false, 0, zimmeranz, preisd, 0.0, 0.0, 0.0, flaeched, titel, ort, 0, "", 0, "", "", "", "", "", "", "sofort");
                    response.sendRedirect("immobilie.jsp?id="+neueId);
                    break;
                } 
                    
                //source: immobilie.jsp, immobilie_edit.jsp
                //Bekommt ImmobilienID übergeben und löscht die Immobilie mit derID aus der Datenverwaltung
                case "Loeschen":
                {
                    int immo_idd = Integer.parseInt(request.getParameter("immo_id"));
                        
                    dv.immobilieEntfernen(immo_idd);
                    response.sendRedirect("benutzer.jsp");
                    break;
                }
                    
                //source: immobilien_edit.jsp
                //Bekommt modifizierte Werte einer bestehenden Immobilie und überschreibt die jeweilige Immobilie in der Datenverwaltung
                case "Speichern":
                {
                    int immo_idd = 0;
                    String immo_id = ""+request.getParameter("immo_id");
                    if(immo_id!="")
                        immo_idd = Integer.parseInt(immo_id);
                        
                    //Finanzieller Teil
                    String titel = ""+request.getParameter("titel");
                    double preis = Double.parseDouble(request.getParameter("preis"));
                    double nebenkosten = Double.parseDouble(request.getParameter("nebenkosten"));        
                    double kaution = Double.parseDouble(request.getParameter("kaution"));
                    double provision = Double.parseDouble(request.getParameter("provision"));
                              
                    //Räumlicher Teil
                    double zimmer = Double.parseDouble(request.getParameter("zimmer"));
                    double flaeche = Double.parseDouble(request.getParameter("flaeche"));
                    int schlafzimmer = Integer.parseInt(request.getParameter("schlafzimmer"));
                    int badezimmer = Integer.parseInt(request.getParameter("badezimmer"));
                        
                    String bezugsfrei = ""+request.getParameter("bezugsfrei");  
                    boolean balkon = Boolean.getBoolean(request.getParameter("balkon"));
                    boolean garten = Boolean.getBoolean(request.getParameter("garten"));
                    boolean keller = Boolean.getBoolean(request.getParameter("keller"));
                        
                    String ort = ""+request.getParameter("ort");  
                    int plz = Integer.parseInt(request.getParameter("plz"));
                    String strasse = ""+request.getParameter("strasse");  
                    int nummer = Integer.parseInt(request.getParameter("nummer"));

                    dv.immobilieAendern(immo_idd, titel, preis, nebenkosten, kaution, provision, zimmer, flaeche, schlafzimmer, badezimmer, bezugsfrei, balkon, garten, keller, ort, plz, strasse, nummer);
                       
                    response.sendRedirect("immobilie.jsp?id="+immo_idd);
                    break;
                }   
                    
                case "Verschicken":
                {
                    String betreff = ""+request.getParameter("betreff");
                    String text = ""+request.getParameter("text");
                    String absender = ""+request.getParameter("absender");
                    String empfaenger = ""+request.getParameter("empfaenger");
                    
                    Properties props = new Properties();
                    props.put("mail.smtp.starttls.enable","true");
                    Session sessions = Session.getDefaultInstance(props,null);
                    MimeMessage message = new MimeMessage(sessions);
                    try
                    {
                        message.setSubject(betreff);
                        message.setText(text,"UTF-8");
                        Address address = new InternetAddress(absender);
                        message.setFrom(address);
                        Address toAddress = new InternetAddress(empfaenger);
                        message.addRecipient(Message.RecipientType.TO,toAddress);
                        Transport transport = sessions.getTransport("smtp");
                        transport.connect("smtp.1und1.de","marcel.krause@hs-onlinemarketing.de","aD25?bl7");
                        transport.sendMessage(message,message.getAllRecipients());
                        transport.close();
                    }
                    catch (Exception e)
                    {
                       
                    }
        
        
                    response.sendRedirect("traumhaus.jsp");
                    break;
                }
            }
        }    
        finally  
        {            
           out.close();   
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
